package com.z.redis.command.impl.list;

import com.z.redis.RedisCore;
import com.z.redis.command.Command;
import com.z.redis.command.CommandType;
import com.z.redis.datatype.BytesWrapper;
import com.z.redis.datatype.RedisList;
import com.z.redis.resp.BulkString;
import com.z.redis.resp.Resp;
import com.z.redis.resp.RespArray;
import io.netty.channel.ChannelHandlerContext;

import java.util.List;

/**
 * 获取list中的指定范围的键值
 */
public class Lrange implements Command {
    private BytesWrapper key; // 存储列表的键
    private int start; // 起始索引
    private int end; // 结束索引

    @Override
    public CommandType type(){
        return CommandType.lrange;
    }

    @Override
    public void setContent(Resp[] array){
        key = ((BulkString) array[1]).getContent();
        start = Integer.parseInt(((BulkString) array[2]).getContent().toUTF8String());
        end = Integer.parseInt(((BulkString) array[3]).getContent().toUTF8String());
    }

    public void handle(ChannelHandlerContext ctx, RedisCore redisCore){
        RedisList redisList = (RedisList) redisCore.get(key);
        List<BytesWrapper> lrange = redisList.lrange(start,end);
        RespArray respArray = new RespArray(lrange.stream().map(BulkString::new).toArray(Resp[]::new));
        ctx.writeAndFlush(respArray);
    }
}
